package com.zhu.service.base.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;


@Configuration
@EnableAsync //开启线程池
public class ThreadConfig {
    @Bean("taskExecutor")
    public Executor asyncServiceExecutor(){
        ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
        //设置核心线程数
        executor.setCorePoolSize(5);
        //设置最大线程数
        executor.setMaxPoolSize(20);
        //设置线程活跃时间
        executor.setKeepAliveSeconds(60);

        //配置队列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
       //设置默认线程名称
        executor.setThreadNamePrefix("EduTeacherThreadLocal");
        //线程执行完成之后关闭
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //初始化线程
       executor.initialize();
       return executor;

    }
//    CorePoolSize（）:
    /**
     * 设置线程池核心容量
     * 核心线程会一直存活,即使没有任务需要处理.当线程数小于核心线程数时,
     * 即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交
     * 给现有的线程处理;核心线程在allowCoreThreadTimeout被设置为true时
     * 会超时退出,默认情况下不会退出..
     */

  //  MaxPoolSize():
    /**
     *  当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,
     *  直到线程数量达到maxPoolSize.如果线程数已等于maxPoolSize,且任务
     *  队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常;
     */

   // QueueCapacity():
    /**
     * 任务队列容量.从maxPoolSize的描述上可以看出,任务队列的容量会影响到线
     * 程的变化,因此任务队列的长度也需要恰当的设置.我们中给了10000,相当于就
     * 是没有上限了....
     */


   // KeepAliveSeconds():
    /**
     * 当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize,
     * 如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0.
     */


   // AllowCoreThreadTimeout():
    /**
     * 是否允许核心线程空闲退出,默认值为false.一般就使用false的
     */


   // ThreadNamePrefix():
    /**
     * 设置线程池 前缀
     */

    //WaitForTasksToCompleteOnShutdown():
    /**
     * 在配置了spring线程池的情况下，如果某时刻要停止应用，如果没有优雅停机，\
     * 存在于线程池中的任务将会被强制停止，导致部分任务失败
     * WaitForTasksToCompleteOnShutdown=true（默认为false），表明等待所有线程执行完


     AwaitTerminationSeconds():
     /**在配置了spring线程池的情况下，如果某时刻要停止应用，如果没有优雅停机，
     * 存在于线程池中的任务将会被强制停止，导致部分任务失败
     * AwaitTerminationSeconds=xx（默认为0，此时立即停止），并没等待xx秒后强制停止
     */
}
